package com.example.emb.controller;
import java.io.InputStream;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.UUID;

import com.example.emb.until.JsonResult;
import io.minio.RemoveObjectArgs;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import io.minio.MinioClient;
import io.minio.PutObjectArgs;
import springfox.documentation.spring.web.json.Json;

@RestController
@Api(tags = "上传的操作，只要是上传都要放在这里进行得到url之后进行其他的操作")
@RequestMapping("/upload")
public class MinIoController {

    static final Logger log = LoggerFactory.getLogger(MinIoController.class);

    // 日期格式化
    static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("/yyy/MM/dd/");

    // 资源的 访问 URL
    @Value("${minio.base-url}")
    private String baseUrl;

    // API 端点
    @Value("${minio.endpoint}")
    private String endpoint;

    // Bucket 存储桶
    @Value("${minio.bucket}")
    private String bucket;

    // Acess Key
    @Value("${minio.access-key}")
    private String accessKey;

    // Secret Key
    @Value("${minio.secret-key}")
    private String secretKey;

    /**
     * 上传文件到 Minio 服务器，返回访问地址
     * @param file
     * @return
     * @throws Exception
     */
    @ApiOperation("文件的上传都放在这里，会返回一个存储的url，在浏览器上可以直接打开,没有删除，直接修改上传到元素中的url")
    @PostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
    public ResponseEntity<String> upload(@RequestParam("file") MultipartFile file) throws Exception{

        // 文件大小
        long size = file.getSize();
        if (size == 0) {
            return ResponseEntity.badRequest().body("禁止上传空文件");
        }

        // 文件名称
        String fileName = file.getOriginalFilename();

        // 文件后缀
        String ext = "";

        int index = fileName.lastIndexOf(".");
        if (index ==-1) {
            return ResponseEntity.badRequest().body("禁止上传无后缀的文件");
        }

        ext = fileName.substring(index);

        // 文件类型
        String contentType = file.getContentType();
        if (contentType == null) {
            contentType = MediaType.APPLICATION_OCTET_STREAM_VALUE;
        }

        // 根据日期打散目录，使用 UUID 重命名文件
        String filePath = formatter.format(LocalDate.now()) +
                UUID.randomUUID().toString().replace("-", "") +
                ext;

        log.info("文件名称：{}", fileName);
        log.info("文件大小：{}", size);
        log.info("文件类型：{}", contentType);
        log.info("文件路径：{}", filePath);

        // 实例化客户端
        MinioClient client = MinioClient.builder()
                .endpoint(this.endpoint)
                .credentials(this.accessKey, this.secretKey)
                .build();


        // 上传文件到客户端
        try (InputStream inputStream = file.getInputStream()){
            client.putObject(PutObjectArgs.builder()
                    .bucket(this.bucket)		// 指定 Bucket
                    .contentType(contentType)	// 指定 Content Type
                    .object(filePath)			// 指定文件的路径
                    .stream(inputStream, size, -1) // 文件的 Inputstream 流
                    .build());
        }

        // 返回最终的访问路径
        return ResponseEntity.ok(this.baseUrl + this.bucket + filePath);
    }
//
//    @ApiOperation("删除 Minio 服务器上的文件")
//    @DeleteMapping
//    public JsonResult<String> delete(@RequestParam("filePath") String filePath) throws Exception {
//        // 实例化客户端
//        MinioClient client = MinioClient.builder()
//                .endpoint(this.endpoint) // 使用正确的 MinIO 端点
//                .credentials(this.accessKey, this.secretKey)
//                .build();
//
//        // 删除文件
//        client.removeObject(RemoveObjectArgs.builder()
//                .bucket(this.bucket)
//                .object("745f8cec5d7144ab8413b2aeef46fe76.jpg")
//                .build());
//
//        return new  JsonResult<String>(200,"文件删除成功");
//    }
//    public String extractFilePath(String url) {
//        // 找到文件路径中 "/files/" 的索引
//        int startIndex = url.indexOf("/files/");
//        if (startIndex == -1) {
//            // 如果找不到 "/files/"，则返回空字符串或者抛出异常，视情况而定
//            return ""; // 或者抛出 IllegalArgumentException 等异常
//        }
//
//        // 使用 substring 方法截取索引之后的部分作为文件路径
//        String filePath = url.substring(startIndex);
//
//        return filePath;
//    }

}
